package com.lancoo.ccas52.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.lancoo.ccas52.config.MybatisRedisCache;
import com.lancoo.ccas52.entity.Room;
import com.lancoo.ccas52.entity.Schedule;
import com.lancoo.ccas52.pojo.dto.*;
import com.lancoo.ccas52.pojo.vo.PublishStatisticsArrangeClass;
import com.lancoo.ccas52.pojo.vo.ScheduleUnitVo;
import org.apache.ibatis.annotations.CacheNamespace;
import org.apache.ibatis.annotations.Param;

import java.util.Collection;
import java.util.List;

/**
 * <p>
 * 课表 Mapper 接口
 * </p>
 *
 * @author quin.song
 * @since 2023-03-27
 */
@CacheNamespace(implementation = MybatisRedisCache.class, eviction = MybatisRedisCache.class)
public interface ScheduleMapper extends BaseMapper<Schedule> {

    int addBatch(@Param("scheduleCollection") Collection<Schedule> scheduleCollection);

    /**
     * 统计课表编排状态
     * @param taskId
     * @return
     */
    @Deprecated
    List<PublishStatisticsArrangeClass> getPublishStatisticsArrange(@Param("taskId") Integer taskId);

    /**
     * 获取未排课的排课单元
     * @param teachingClassId
     * @param hourType
     * @return
     */
    List<ScheduleUnitVo> getEmptyScheduleUnit(@Param("taskId") Integer taskId);

    /**
     * 获取可用教室
     * @param taskId
     * @param studentNumber 学生人数  教室容量须大于等于学生人数
     * @param roomType 教室类型
     * @param unitNum 一周总学时 已排需要小于这个值
     * @return
     */
    List<Room> getOptionalRoom(@Param("taskId") Integer taskId,@Param("studentNumber") Integer studentNumber,@Param("roomType") Integer roomType,@Param("unitNum") Integer unitNum);


    /**
     * 根据教学班id获取多个教学班教学安排
     *
     * @param taskId
     * @param teachingClassIds
     * @return
     */
    List<ScheduleDto> getScheduleByTeachingClassIds(@Param("taskId") Integer taskId, @Param("teachingClassIds") List<Long> teachingClassIds);

    /**
     * 根据教学班id获取多个教学班教学安排 roomid
     * @param taskId
     * @param teachingClassIds
     * @param roomId
     * @return
     */
    List<ScheduleDto> getScheduleByTeachingClassIdsAndRoomId(@Param("taskId") Integer taskId, @Param("teachingClassIds") List<Long> teachingClassIds,@Param("roomId") Long roomId);

    /**
     * 获取锁定的教学班课表
     * @param taskId
     * @param campusId
     * @return
     */
    List<ArrangeScheduleDto> getScheduleLocked(@Param("taskId") Integer taskId, @Param("campusId") String campusId, @Param("isLocked") Integer isLocked, @Param("collegeId") String collegeId);

    /**
     * 根据任务id获取全部课表
     * @param taskIds
     * @param campusId
     * @param isLocked
     * @param roomType
     * @return
     */
    List<ArrangeScheduleDto> getScheduleLockedByIds(@Param("taskIds") List<Integer> taskIds, @Param("campusId") String campusId, @Param("isLocked") Integer isLocked);

    /**
     * 同步课表到基础平台封装
     * @param taskId
     * @return
     */
    List<SyncScheduleDto> syncScheduleDto(@Param("taskId") Integer taskId, @Param("teachingClassType") Integer teachingClassType);

    /**
     * 获取课表数据 包含导出课表所需数据
     * @param taskId
     * @param teachingClassIds 教学班id
     * @param roomIds 教室id
     * @return
     */
    List<AllScheduleDto> getTeachingClassSchedule(@Param("taskId") Integer taskId,
                                                  @Param("teachingClassIds") List<Long> teachingClassIds, @Param("roomIds") List<Long> roomIds);

    List<ScheduleStatistics> getScheduleStatistics(@Param("teachingClassIds") List<Long> teachingClassIds);
}